package com.sl.au.service;

import java.util.List;
import java.util.Map;

import org.activiti.engine.runtime.ProcessInstance;

import com.sl.au.entity.AuditRoot;
import com.sl.au.entity.Contract;
import com.sl.au.entity.ContractCruxDate;
import com.sl.au.entity.ContractInfo;
import com.sl.au.entity.ContractPart;
import com.sl.au.entity.ContractPump;
import com.sl.au.entity.ContractRepair;
import com.sl.au.entity.DivideScale;
import com.sl.au.entity.QuoteDevice;
import com.sl.au.entity.QuoteReplacement;
import com.sl.au.entity.Root;
import com.sl.au.entity.User;
import com.sl.au.repository.ContractCruxDateRepository;
import com.sl.au.repository.ContractInfoRepository;
import com.sl.au.repository.ContractPartRepository;
import com.sl.au.repository.ContractPumpRepository;
import com.sl.au.repository.ContractRepairRepository;
import com.sl.au.repository.ContractRepository;
import com.sl.au.repository.DetailRelevanceRepository;
import com.sl.au.repository.DeviceRepository;
import com.sl.au.repository.DivideScaleRepository;
import com.sl.au.repository.QuoteDeviceRepository;
import com.sl.au.repository.QuoteReplacementRepository;
import com.sl.au.repository.ReplacementDeviceRepository;

/**
 * 合同管理服务
 * @author XH
 *
 */
public interface ContractService extends BaseService {

ContractRepository getRepository();

ContractInfoRepository getContractInfoRepository();

DivideScaleRepository getRepository1();

ContractPartRepository getRepository2();

ContractPumpRepository getRepository3();

ContractRepairRepository getRepository4();

QuoteDeviceRepository getRepository5();

DetailRelevanceRepository getRepository6();

ReplacementDeviceRepository getRepository7();

DeviceRepository getRepository8();

QuoteReplacementRepository getRepository9();

ContractCruxDateRepository getRepository10();
/**
 * 通过contractId获取实际发货时间、调试完成时间、验收完成时间三个时间
 */
ContractInfo getDateContractById(String contractId);
/**
 * 服务器分页查询当前用户的所有合同
 * @param start
 * @param length
 * @param key
 * @param orderName
 * @param dir
 * @return
 */
List<ContractInfo> getContractInfos(int start, int length,Map<String, String> condition,String orderName ,String dir);
/**
 * 改变合同状态
 * @param contractInfo 合同号
 * @param contractType 合同类型
 * @param type 状态
 * @return
 */
int suspendAndRevocationContractInfo(String contractInfo,String contractType,String type);

/**
 * 通过条件得到合同条数
 * @param key
 * @return
 */
long getContractInfosCount(Map<String, String> condition);

/**
 * 服务器分页查询与当前客户相关的所有合同
 * @param start
 * @param length
 * @param key
 * @param orderName
 * @param dir
 * @return
 */
List<ContractInfo> getContractInfosByCustomer(int start, int length,Map<String, String> condition,String orderName ,String dir);

/**
 * 通过条件得到与当前客户相关的合同条数
 * @param key
 * @return
 */
long getContractInfosByCustomerCount(Map<String, String> condition);

/**
 * 有查询条件时服务器分页
 * @param start
 * @param length
 * @param key
 * @param orderName
 * @param dir
 * @return
 */
List<Contract> getContracts(int start, int length,String key,String orderName ,String dir);

/**
 * 通过条件得到项目合同条数
 * @param key
 * @return
 */
long getContractsCount(String key);

/**
 * 获取当前合同关键点
 * @param start
 * @param length
 * @param contractId
 * @param orderName
 * @param dir
 * @return
 */
List<ContractCruxDate> getContractCruxDates(int start, int length,String contractId,String orderName ,String dir);

/**
 * 获取当前合同关键点条数
 * @param start
 * @param length
 * @param contractId
 * @param orderName
 * @param dir
 * @return
 */
long getContractCruxDatesCount(String contractId);

/**
 * 新建/编辑合同关键点保存
 */
void saveContractCruxDate(ContractCruxDate contractCruxDate);

/**
 * 删除合同关键点
 * @param ids 关键点id
 */
void deleteContractCruxDate(String ids);

/**
 * 通过合同id、type删除合同数据
 * @param contractInfo 合同信息
 * @return
 */
void deleteContract(String contractInfo);

/**
 * 通过当前用户部门得到该部门下所有人员
 * @param superior 部门
 * @return
 */
List<User> getAllSuperiorMenBySuperior(String superior);

/**
 * 通过当前用户部门得到该部门下所有的部门-片区
 * @param superior 部门
 * @return
 */
List<Object> getSuperiorAreasBySuperior(String superior);

/**
 * 通过当前用户部门得到该部门下所有的片区
 * @param superior 部门
 * @return
 */
List<Object> getAreasBySuperior(String superior);

/**
 * 通过角色名得到该部门的责任人(处长、副处长、片区经理)
 * @param head 处长
 * @param deputyHead 副处长
 * @param manager 片区经理
 * @return
 */
List<Object> getDutyOfficersByroleName(String head, String deputyHead, String manager);

/**
 * 通过角色名得到该角色的用户名
 * @param roleName 角色名
 * @return
 */
List<Object> getUserNamesByroleName(String roleName);

/**
 * 通过contractId得到项目合同信息
 * @param contractId
 * @return
 */
Contract getContractById(String contractId);

/**
 * 通过contractId得到备件合同信息
 * @param contractId
 * @return
 */
ContractPart getContractPartById(String contractId);

/**
 * 通过contractId得到备泵合同信息
 * @param contractId
 * @return
 */
ContractPump getContractPumpById(String contractId);

/**
 * 通过contractId得到维修合同信息
 * @param contractId
 * @return
 */
ContractRepair getContractRepairById(String contractId);

/**
 * 除去该合同供方合同号也为supplierCode的条数
 * @param contractId
 * @param supplierCode
 * @return
 */
int getContractInfosCountBySupplierCode(String id, String code);

/**
 * 得到该项目合同的占比划分总金额
 * @param contractId
 * @return
 */
float getAllScaleDivide(String id);

/**
 * 保存合同
 * @return 
 */
Map<String, Object> saveContract(Root root);

/**
 * 根据项目合同供方合同号得到项目合同
 * @param supplierCode
 * @return
 */
Contract getContractBySupplierCode(String supplierCode);

/**
 * 通过contractId得到当前项目合同的占比划分
 * @param contractId
 * @return
 */
List<DivideScale> getContractDivideScales(int start, int length, String contractId, String orderName, String dir);

/**
 * 通过contractId得到当前项目合同的占比划分条数
 * @param contractId
 * @return
 */
long getContractDivideScalesCount(String contractId);

/**
 * 删除选中的项目合同的占比划分
 * @param ids 占比划分id
 * @return
 */
void deleteDivideScale(String ids);

/**
 * 通过(备件、备泵、维修)合同Id得到细目已关联的合同
 * @param contractId
 * @return
 */
List<Contract> getRelevanceContracts(int start, int length, String contractId, String orderName, String dir);

/**
 * 通过(备件、备泵、维修)合同Id得到细目已关联的合同条数
 * @param contractId
 * @return
 */
long getRelevanceContractsCount(String contractId);

/**
 * 通过合同类型和合同Id得到合同的供方合同号
 * @param contractType
 * @param contractId
 * @return
 */
String getSupplierCodeByTypeAndId(String type, String id);

/**
 * 通过contractId得到当前(项目、备泵、维修)合同细目泵
 * @param contractId
 * @return
 */
List<QuoteDevice> getDevices(int start, int length, String contractId, String orderName, String dir);

/**
 * 通过contractId得到当前(项目、备泵、维修)合同细目泵条数
 * @param contractId
 * @return
 */
long getDevicesCount(String contractId);

/**
 * 删除选中的(项目、备泵、维修)合同细目泵
 * @param ids 合同细目泵id
 * @return
 */
void deleteDevice(String ids);

/**
 * 保存新建/编辑(项目、备泵、维修)合同细目单个泵
 * @return
 */
void editOneDevice(QuoteDevice quoteDevice);

/**
 * 保存批量编辑(备泵、维修)合同细目泵
 * @param replacementInfo 细目信息
 * @return
 */
void editMoreDevice(String deviceInfo);

/**
 * 通过contractId得到当前(项目、备件、维修)合同细目配件
 * @param contractId
 * @return
 */
List<QuoteReplacement> getReplacements(int start, int length, String contractId, String orderName, String dir);

/**
 * 通过contractId得到当前(项目、备件、维修)合同细目配件条数
 * @param contractId
 * @return
 */
long getReplacementsCount(String contractId);

/**
 * 删除选中的(项目、备件、维修)合同细目配件
 * @param ids 合同细目泵id
 * @return
 */
void deleteReplacement(String ids);

/**
 * 保存新建/编辑(项目、备件、维修)合同细目单个备件
 * @return
 */
void editOneReplacement(QuoteReplacement quoteReplacement);

/**
 * 保存批量编辑(备件、维修)合同细目备件
 * @param replacementInfo 细目信息
 * @return
 */
void editMoreReplacement(String replacementInfo);

/**将临时上传的EXCEL文件读取导入到设备明细表中
 * 返回导入记录条数
 * @param fileName 文件名
 * @param contractId 合同ID
 * @param type 项目合同：("1"：泵，"0"：其他)；维修合同：("3"：泵，"2"：其他)；备件合同：4；备泵合同：5
 */
long importExcel(String fileName, String contractId, String type);






/**
 * 没有查询条件时服务器分页
 * @param start
 * @param length
 * @param key
 * @param orderName
 * @param dir
 * @return
 */
List<Contract> getPage(int start, int length, String key ,String orderName ,String dir);

/**
 * 没有查询条件时售后设备信息合同服务器分页
 * @param start
 * @param length
 * @param key
 * @param orderName
 * @param dir
 * @return
 */
List<Contract> getAfterSalePage(int start, int length, String key ,String orderName ,String dir);

/**
 * 有查询条件时售后设备信息合同服务器分页
 * @param start
 * @param length
 * @param key
 * @param orderName
 * @param dir
 * @return
 */
List<Contract> getAfterSaleContracts(int start, int length, String key, String orderName, String dir);

/**
 * 得到所有可以被关联的项目合同的供方合同号
 * @return
 */
List<Object> getContractSupplierCodeList();

/**
 * 通过项目合同Id得到该合同以及其它关联该合同的细目
 * @param contractId
 * @return
 */
List<QuoteDevice> getAllDetails(String contractId);

List<QuoteDevice> getDetails(String contractId, boolean b);

/**
 * 服务器分页查询当前用户的所有合同,按照项目、备件、备泵、维修合同的顺序排序（该服务已废弃，请使用getContractInfos）
 * @param start
 * @param length
 * @param key
 * @param orderName
 * @param dir
 * @return
 */
Map<String, Object> getContractVos(int start, int length,Map<String, String> condition,String orderName ,String dir);

/**
 * 服务器分页查询所有合同,按照项目、备件、备泵、维修合同的顺序排序
 * @param start
 * @param length
 * @param key
 * @param orderName
 * @param dir
 * @return
 */
Map<String, Object> getContractVos(int start, int length,String key,String orderName ,String dir);






void saveProcessStart(String contractId, String contractType, ProcessInstance pInst);
/**保存各类合同
 * @param contractType
 * @param contract
 */
void save(String contractType, AuditRoot contract);
/**通过合同ID和类型返回一个合同
 * @param id
 * @param type
 * @return
 */
AuditRoot getOne(String id,String type);
 
/**组合查询
 * @param start
 * @param length
 * @param condition
 * @param user
 * @param orderName
 * @param dir
 * @return
 */
List<ContractInfo>getQueryContractsHql(int start, int length,Map<String,Object> condition, User user,String orderName ,String dir);
long getQueryCount(Map<String,String> condition, User user);

String genQuoteDocx(String id, User user);
}
